import { defineStore } from 'pinia';
import { ref, computed } from 'vue';
import { userApi } from '@/api'; // 引入我们重构后的 userApi
import { useRouter } from 'vue-router';

// 将 defineStore 的返回值导出，并重命名为 useUserStore，这是 Pinia 的标准用法
export const useUserStore = defineStore('user', () => {
    const router = useRouter();

    // =================================
    // 1. State (状态)
    // =================================
    // 从 localStorage 初始化 token 和用户信息，实现持久化
    const token = ref(localStorage.getItem('jwt-token') || null);
    const userInfo = ref(JSON.parse(localStorage.getItem('user-info')) || {});

    // =================================
    // 2. Getters (获取器)
    // =================================
    // 使用 computed 创建一个 getter，判断用户是否登录
    const isLoggedIn = computed(() => !!token.value);
    
    // =================================
    // 3. Actions (行为)
    // =================================

    /**
     * 登录并获取 Token 和用户信息
     * @param {string} username - 用户名
     * @param {string} password - 密码
     */
    const login = async (username, password) => {
        try {
            // 调用 API 进行登录
            const response = await userApi.login(username, password);
            
            // Spring Security JWT 成功后返回的格式 
            // { 
            //   "id_token": "eyJhbGciOiJ..." 
            // }
            // 或者有些实现可能直接返回 token 字符串
            let jwtToken;
            
            if (typeof response === 'object' && response !== null) {
                jwtToken = response.id_token || response.token || response.access_token;
            } else if (typeof response === 'string') {
                jwtToken = response; // 直接是token字符串
            }
            
            if (!jwtToken) {
                console.error('登录响应不包含有效令牌:', response);
                throw new Error('登录成功但未获取到有效令牌');
            }
            
            // 更新 state
            token.value = jwtToken;
            
            // 将 token 存入 localStorage
            localStorage.setItem('jwt-token', jwtToken);

            try {
                // 尝试获取用户信息，但即使失败也不影响登录状态
                await fetchUserInfo();
            } catch (userInfoError) {
                console.error('获取用户信息失败，但登录已完成:', userInfoError);
                
                // 从JWT中提取基本用户信息
                try {
                    const base64Url = jwtToken.split('.')[1];
                    if (base64Url) {
                        const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
                        const decodedData = JSON.parse(window.atob(base64));
                        
                        const basicUserInfo = {
                            username: decodedData.sub || username,
                            // 权限可能在不同的字段中
                            authorities: 
                                decodedData.authorities || 
                                (decodedData.auth ? [{ name: decodedData.auth }] : []),
                            id: decodedData.id || null
                        };
                        
                        userInfo.value = basicUserInfo;
                        localStorage.setItem('user-info', JSON.stringify(basicUserInfo));
                    }
                } catch (e) {
                    console.error('无法从JWT解析用户信息:', e);
                    // 至少保存用户名
                    userInfo.value = { username };
                    localStorage.setItem('user-info', JSON.stringify({ username }));
                }
            }
            
            return token.value;
        } catch (error) {
            console.error('登录过程发生错误:', error);
            throw error;
        }
    };

    /**
     * 获取当前登录用户的详细信息
     */
    const fetchUserInfo = async () => {
        if (!token.value) return; // 如果没有 token，则不执行
        
        try {
            // 调用获取当前用户信息的接口
            const user = await userApi.getCurrentUser();
            
            if (user) {
                userInfo.value = user;
                localStorage.setItem('user-info', JSON.stringify(user));
                console.log('用户信息获取成功:', user);
                return user;
            } else {
                console.warn('获取用户信息返回空值');
                // 仍然允许用户登录，只是没有详细信息
                return null;
            }
        } catch (error) {
            console.error("获取用户信息失败:", error);
            
            // 尝试解析JWT token以获取基本信息
            if (token.value) {
                try {
                    // 简单提取JWT的payload部分并解码
                    const base64Url = token.value.split('.')[1];
                    if (base64Url) {
                        const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
                        const decodedData = JSON.parse(window.atob(base64));
                        
                        // 从JWT提取基本用户信息
                        const basicUserInfo = {
                            username: decodedData.sub || 'unknown',
                            authorities: decodedData.auth ? [{ name: decodedData.auth }] : [],
                            id: decodedData.id || null
                        };
                        
                        userInfo.value = basicUserInfo;
                        localStorage.setItem('user-info', JSON.stringify(basicUserInfo));
                        console.log('从JWT提取的基本用户信息:', basicUserInfo);
                        return basicUserInfo;
                    }
                } catch (jwtError) {
                    console.error('解析JWT失败:', jwtError);
                }
            }
            
            // 如果API请求失败但是token存在，我们不会自动登出
            // 而是返回null，让调用者决定如何处理
            return null;
        }
    };

    /**
     * 用户登出
     */
    const logout = () => {
        // 清空 state
        token.value = null;
        userInfo.value = {};

        // 清空 localStorage
        localStorage.removeItem('jwt-token');
        localStorage.removeItem('user-info');

        // 登出后跳转到登录页
        // 使用 replace 防止用户通过浏览器后退回到需要登录的页面
        router.replace('/login');
    };

    // 将 state、getters 和 actions 返回，以便组件中使用
    return { 
        token, 
        userInfo, 
        isLoggedIn, 
        login, 
        fetchUserInfo,
        logout 
    };
});